package com.tedu.api.ee;

import org.junit.Test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

/**
 * java有一套完善异常处理操作
 * 程序中对应出现什么问题，就会有对应异常【对象】提供出来，错误也是对象！
 *
 * Throwable 顶级超类--抛出错误！
 *    子类：Exception对象:程序级别的错误(经常遇见)
 *            编译期 FileOutputStream(编写代码同时，下方波浪线)
 *            处理方式①：抛出异常：不干什么错误，抛出方法外
 *                   ②：捕获异常：抓到异常，记录异常错误信息
 *            检查异常：通常由编译器检查出来，存在异常类，抛出，捕获！
 *            运行期--控制台：（IDE开发工具控制台，显示出红色，异常类名字）
 *            非检查异常：RuntimeException(认为所有异常来自于RuntimeException)
 *                           所有异常都是RuntimeException的子类！
 *    子类：Error对象:描述系统级别的错误（不常见）
 *        ---测试：程序挂了？  利用字符串不断拼接--Error
 *        String str="字符串";  直接量写出字符串-----存常量池
 */
public class EE {
    /**
     * Error 错误---递归方式找溢出
     * 1.创建静态方法method
     * 2.在静态方法中调用method
     * 3.通过testError中单元测试--调用EE对象下的method方法
     */
    public static void method() {
        method();
    }

    @Test
    public void testError() {
        EE.method();//StackOverflowError
    }
    //Exception 检查异常 ---处理手段2：捕获方式--预判：程序会出什么异常

    /**
     * 捕获异常语法：
     * try{
     * 可能出现的异常代码段中添加
     * }else(异常名字 e){
     * e.printStackTrace();打印异常信息--
     * 方便开发者的原因
     * }catch(异常名字【中异常】 e){
     * e.printStackTrace();
     * }else(异常名字【大异常】 e){
     * e.printStackTrace();
     * }finally{
     * 捕获异常---必须执行代码块----IO关闭流
     * }
     * <p>
     * 捕获异常快捷键：ctrl+alt+t  选中可能出现错误代码块
     */
    @Test
    public void testException() {
        try {
            String s = "a";
            //StringIndexOutOfBoundsException异常---产生原因：字符串下标越界异常
            //异常产生原因：指定下标超出字符串范围
            s.charAt(0);

            //NullPointerException异常--空指针异常
            //产生异常原因：字符串为空，拿到数据值为空时
            s.length();

            //NumberFormatException异常：数值转换异常
            //异常产生原因：将存储的不是整数的字符串，转换为整数
            Integer.parseInt(s);//a不是整数类型
        } catch (NumberFormatException e) {//数值转换异常
            e.printStackTrace();//打印异常信息---提供线索
        } catch (NullPointerException e) {//空指针异常
            e.printStackTrace();//打印异常信息---提供线索
        } catch (StringIndexOutOfBoundsException e) {//下标越界异常
            e.printStackTrace();//打印异常信息---提供线索
        } finally {
            System.out.println("一直执行代码块");
        }
    }

//需求：写出代码短5个错误【分析：1次抓1个错误】，使用try---catch捕获打印信息
//提示：字符串，集合中，标准IO，包装类---由API
    public class Main1{
    public void main(String[] args) throws FileNotFoundException {
//        File file=new File("不存在文件路径");
//        FileReader reader=new FileReader(file);

//        //NumberFormatException
//        String s="Yes";
//        s.charAt(5);
//
//
//        //ArithmeticException   运算错误:数字不可以除以0
//
//            int a = 11;
//            int b = 0;
//            System.out.println(a / b);



        //ArrayStoreException   存储数据类型异常
        Object[] objs=new String[6];
        objs[0]=new Integer(4);
        System.out.println(objs);


    }


 }
}



